package com.allwees.bs.c.module.address.data;

import com.alibaba.fastjson.JSON;
import com.allwees.bs.c.module.address.entity.RegionCountry;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/*
2020.12.5 重写地理位置服务主要解决几个问题

1、地理位置支持多种国家的对外接口统一。
2、针对不同国家省、乡、镇挂点不一至的问题，改成链式通用的结构。
3、对同一个国家可以支持【多种语言】的街道显示。
4、将数据存储改为内存读取，一个是速度效率上，另一方面使用 JSON 在可读性修改上。
5、支持动态扩展更多的国家地理位置数据。
*/

/**
 * 地理位置服务提供者，用于解析 JSON 为可操作对象。
 */
@Service
public class AddressDataProvider {
    /**
     * 所有的国家的集合
     */
    private final List<RegionCountry> regionCountries = new ArrayList<>();

    /**
     * 数据分析
     */
    public AddressDataProvider() {
        String[] resourceFiles = new String[]{
                "address/china.json"
        };

        for (String resourceFile : resourceFiles) {
            try {
                doAnalyzer(getResourceJson(resourceFile));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 获取资源的 JSON 数据
     *
     * @param resourceFile 资源文件
     * @return JSON 数据
     */
    private String getResourceJson(String resourceFile) throws IOException {
        ClassPathResource classPathResource = new ClassPathResource(resourceFile);
        File file = classPathResource.getFile();
        BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
        StringBuilder stringBuilder = new StringBuilder();
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            stringBuilder.append(line);
        }

        return stringBuilder.toString();
    }

    /**
     * 分析将 JSON 文件转换为类对象
     *
     * @param jsonStr json 字符
     */
    private void doAnalyzer(String jsonStr) {
        RegionCountry regionCountry = JSON.parseObject(jsonStr, RegionCountry.class);
        regionCountries.add(regionCountry);
    }

    /**
     * 获取所有的解析国家详情
     *
     * @return 国家详情
     */
    public List<RegionCountry> getRegionCountries() {
        return regionCountries;
    }
}
